gl renderer: Don't render opacity nodes offscreen
authorTimm Bäder <mail@baedert.org>
Thu, 7 Dec 2017 16:30:02 +0000 (17:30 +0100)
committerTimm Bäder <mail@baedert.org>
Thu, 21 Dec 2017 18:12:32 +0000 (19:12 +0100)
We already drag a u_alpha uniform around in every shader, so use that
one.

gsk/gl/gskglrenderer.c
gsk/gl/gskglrenderops.c
gsk/gl/gskglrenderopsprivate.h

index fb98de3b083e8165b846cae72351d9517bde9dbc..0555da735fab264f2c27dd4a2f6d145516d22342 100644 (file)
@@ -1029,37 +1029,13 @@ gsk_gl_renderer_add_render_ops (GskGLRenderer   *self,
 
     case GSK_OPACITY_NODE:
       {
-        int texture_id;
-        gboolean is_offscreen;
         float prev_opacity;
 
+        prev_opacity = ops_set_opacity (builder,
+                                        builder->current_opacity * gsk_opacity_node_get_opacity (node));
 
-        add_offscreen_ops (self, builder, min_x, max_x, min_y, max_y,
-                           gsk_opacity_node_get_child (node),
-                           &texture_id, &is_offscreen);
-
-        /* Now draw the texture with the node's opacity */
-        ops_set_program (builder, &self->blit_program);
-        prev_opacity = ops_set_opacity (builder, gsk_opacity_node_get_opacity (node));
-        ops_set_texture (builder, texture_id);
-
-        if (is_offscreen)
-          {
-            GskQuadVertex vertex_data[GL_N_VERTICES] = {
-              { { min_x, min_y }, { 0, 1 }, },
-              { { min_x, max_y }, { 0, 0 }, },
-              { { max_x, min_y }, { 1, 1 }, },
+        gsk_gl_renderer_add_render_ops (self, gsk_opacity_node_get_child (node), builder);
 
-              { { max_x, max_y }, { 1, 0 }, },
-              { { min_x, max_y }, { 0, 0 }, },
-              { { max_x, min_y }, { 1, 1 }, },
-            };
-            ops_draw (builder, vertex_data);
-          }
-        else
-          {
-            ops_draw (builder, vertex_data);
-          }
         ops_set_opacity (builder, prev_opacity);
       }
     break;
index 8e96888b728d8e3337e5e371c29a590deea1dc40..d3fa195285c4d6c946f10a368f54f52c558f132b 100644 (file)
@@ -65,6 +65,14 @@ ops_set_program (RenderOpBuilder *builder,
       g_array_append_val (builder->render_ops, op);
       builder->program_state[program->index].clip = builder->current_clip;
     }
+
+  if (builder->program_state[program->index].opacity != builder->current_opacity)
+    {
+      op.op = OP_CHANGE_OPACITY;
+      op.opacity = builder->current_opacity;
+      g_array_append_val (builder->render_ops, op);
+      builder->program_state[program->index].opacity = builder->current_opacity;
+    }
 }
 
 GskRoundedRect
@@ -244,6 +252,9 @@ ops_set_opacity (RenderOpBuilder *builder,
   prev_opacity = builder->current_opacity;
   builder->current_opacity = opacity;
 
+  if (builder->current_program != NULL)
+    builder->program_state[builder->current_program->index].opacity = opacity;
+
   return prev_opacity;
 }
 
index 7e353733398686dc59908272e832267afa2f5283..7a7ed397da9ecc08d119b7ac0249aa953a27bb36 100644 (file)
@@ -174,6 +174,7 @@ typedef struct
     graphene_matrix_t projection;
     int source_texture;
     graphene_rect_t viewport;
+    float opacity;
     /* Per-program state */
     union {
       GdkRGBA color;